package hash_1114;


/*
key-value 模型
key 元素类型：Student
value 元素类型：Score

Map 的方法结构
Score put(Student key, Score value);

Score get(Student key);
 */
public class HashTableV2 {
    static class ListNode {
        Student key;
        Score value;
        ListNode next;

        ListNode(Student key, Score value) {
            this.key = key;
            this.value = value;
        }
    }

    private ListNode[] array;
    private int size;

    public HashTableV2() {
        array = new ListNode[7];
        size = 0;
    }

    public Score put(Student key, Score value) {
        int hash = key.hashCode();
        if (hash < 0) {
            hash = -hash;
        }
        int index = hash % array.length;

        ListNode cur = array[index];
        while (cur != null) {
            if (key.equals(cur.key)) {
                Score oldValue = cur.value;
                cur.value = value;
                return oldValue;
            }
            cur = cur.next;
        }

        ListNode node = new ListNode(key, value);
        node.next = array[index];
        array[index] = node;
        size++;

        return null;
    }

    public Score get(Student key) {
        // 1. 对象 -> int 类型（同一个对象，变出的结果应该不变）
        // Object 类型规定了一个 hashCode()
        // Student 需要正确地重写 hashCode
        int hash = key.hashCode();  // 只要对象是 ”相等的“，hash 值一定是相等的
        // 2. 把 hash 值变成合法下标
        if (hash < 0) {
            hash = -hash;
        }
        int index = hash % array.length;

        // 链表中查找
        ListNode cur = array[index];
        while (cur != null) {
            if (key.equals(cur.key)) {  // 要求 Student 正确地重写过 equals 方法
                return cur.value;
            }
            cur = cur.next;
        }

        return null;
    }
}

